"-------------什么是运算符？----------------"
# 举个简单的例子:
# 4 + 5 = 9
# 例子中，4 和 5 被称为操作数，+ 称为运算符。

# Python 语言支持以下类型的运算符:
# 算术运算符
# 比较（关系）运算符
# 赋值运算符
# 逻辑运算符
# 位运算符
# 成员运算符
# 身份运算符
# 运算符优先级

# 接下来让我们一个个来学习Python的运算符。

"--------------Python算术运算符------------------"
a = 21
b = 10
c = 0
c = a + b
print("1 - c 的值为：", c)  # 1 - c 的值为： 31
c = a - b
print("2 - c 的值为：", c)  # 2 - c 的值为： 11
c = a * b
print("3 - c 的值为：", c)  # 3 - c 的值为： 210
c = a / b
print("4 - c 的值为：", c)  # 4 - c 的值为： 2.1
c = a % b
print("5 - c 的值为：", c)  # 5 - c 的值为： 1
# 修改变量 a 、b 、c
a = 2
b = 3
c = a**b
print("6 - c 的值为：", c)  # 6 - c 的值为： 8
a = 10
b = 5
c = a//b
print("7 - c 的值为：", c)  # 7 - c 的值为： 2

"---------------Python比较运算符--------------"
a = 21
b = 10
c = 0
if (a == b):
    print("1 - a 等于 b")
else:
    print("1 - a 不等于 b")  # 1 - a 不等于 b

if (a != b):
    print("2 - a 不等于 b")  # 2 - a 不等于 b
else:
    print("2 - a 等于 b")

if (a < b):
    print("3 - a 小于 b")
else:
    print("3 - a 大于等于 b")  # 3 - a 大于等于 b

if (a > b):
    print("4 - a 大于 b")  # 4 - a 大于 b
else:
    print("4 - a 小于等于 b")

# 修改变量 a 和 b 的值
a = 5
b = 20
if (a <= b):
    print("5 - a 小于等于 b")  # 5 - a 小于等于 b
else:
    print("5 - a 大于  b")

if (b >= a):
    print("6 - b 大于等于 a")  # 6 - b 大于等于 a
else:
    print("6 - b 小于 a")

"---------Python赋值运算符------------"
a = 21
b = 10
c = 0

c = a + b
print("1 - c 的值为：", c)  # 1 - c 的值为： 31

c += a
print("2 - c 的值为：", c)  # 2 - c 的值为： 52

c *= a
print("3 - c 的值为：", c)  # 3 - c 的值为： 1092

c /= a
print("4 - c 的值为：", c)  # 4 - c 的值为： 52.0

c = 2
c %= a
print("5 - c 的值为：", c)  # 5 - c 的值为： 2

c **= a
print("6 - c 的值为：", c)  # 6 - c 的值为： 2097152

c //= a
print("7 - c 的值为：", c)  # 7 - c 的值为： 99864

str_0 = "abcdefghi"
if (c := len(str_0)) > 10:  # 海象运算符，可在表达式内部为变量赋值。Python3.8 版本新增运算符。
    # 先把c赋值成len(str_0)然后可以做其他运算
    print(f"String is too long ({c} elements, expected <= 10)")

# 相当于：
c = len(str_0)
if c > 10:
    print(f"String is to long({c} elements, expected <= 10)")

"--------------Python位运算符(不常用)---------"
# &	按位与运算符：参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0	(a & b) 输出结果 12 ，二进制解释： 0000 1100
# |	按位或运算符：只要对应的二个二进位有一个为1时，结果位就为1。	(a | b) 输出结果 61 ，二进制解释： 0011 1101
# ^	按位异或运算符：当两对应的二进位相异时，结果为1(a ^ b) 输出结果 49 ，二进制解释： 0011 0001
# ~	按位取反运算符：对数据的每个二进制位取反, 即把1变为0, 把0变为1。~x 类似于 - x-1	(~a) 输出结果 - 61 ，二进制解释： 1100 0011， 在一个有符号二进制数的补码形式。
# << 左移动运算符：运算数的各二进位全部左移若干位，由"<<"右边的数指定移动的位数，高位丢弃，低位补0。 a << 2 输出结果 240 ，二进制解释： 1111 0000
# >> 右移动运算符：把">>"左边的运算数的各二进位全部右移若干位，">>"右边的数指定移动的位数 a >> 2 输出结果 15 ，二进制解释： 0000 1111

"---------------------Python逻辑运算符--------------------"
# Python语言支持逻辑运算符，以下假设变量 a 为 10, b为 20:
# x and y	布尔"与" - 如果 x 为 False，x and y 返回 x 的值，否则返回 y 的计算值。	(a and b) 返回 20。
# x or y	布尔"或" - 如果 x 是 True，它返回 x 的值，否则它返回 y 的计算值。	(a or b) 返回 10。
# not x	    布尔"非" - 如果 x 为 True，返回 False 。如果 x 为 False，它返回 True。 not(a and b) 返回 False

"---------------------Python成员运算符--------------"
a = 10
b = 20
list = [1, 2, 3, 4, 5]

if (a in list):
   print("1 - 变量 a 在给定的列表中 list 中")
else:
   print("1 - 变量 a 不在给定的列表中 list 中")

if (b not in list):
   print("2 - 变量 b 不在给定的列表中 list 中")
else:
   print("2 - 变量 b 在给定的列表中 list 中")

# 修改变量 a 的值
a = 2
if (a in list):
   print("3 - 变量 a 在给定的列表中 list 中")
else:
   print("3 - 变量 a 不在给定的列表中 list 中")

"--------------------Python身份运算符----------------"
# is 是判断两个标识符是不是引用自一个对象	x is y, 类似 id(x) == id(y), 如果引用的是同一个对象则返回 True，否则返回 False
# is not 是判断两个标识符是不是引用自不同对象	x is not y ， 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True，否则返回 False。
a = 20
b = 20

if (a is b):
   print("1 - a 和 b 有相同的标识")
else:
   print("1 - a 和 b 没有相同的标识")

if (id(a) == id(b)):
   print("2 - a 和 b 有相同的标识")
else:
   print("2 - a 和 b 没有相同的标识")

# 修改变量  b 的值
b = 30
if (a is b):
   print("3 - a 和 b 有相同的标识")
else:
   print("3 - a 和 b 没有相同的标识")

if (a is not b):
   print("4 - a 和 b 没有相同的标识")
else:
   print("4 - a 和 b 有相同的标识")

"--------------Python运算符优先级-------------------"
"以下表格列出了从最高到最低优先级的所有运算符："
# ** 指数(最高优先级)
# ~ + -	按位翻转, 一元加号和减号(最后两个的方法名为 + @ 和 - @)
# * / % // 乘，除，求余数和取整除
# + - 加法减法
# >> << 右移，左移运算符
# &	位 'AND'
# ^ | 位运算符
# <= < > >= 比较运算符
# == != 等于运算符
# = %= /= //= -= += *= **= 赋值运算符
# is is not 身份运算符
# in not in 成员运算符
# not and or 逻辑运算符
